package com.example.service;

import com.example.domain.dto.pricelist.*;
import com.example.domain.dto.product.ProductListItemDTO;
import com.example.domain.entity.enums.PriceListStatus;
import com.example.domain.valueobject.Money;

import java.util.List;

/**
 * 价目表服务接口
 * 
 * @author Means
 * @since 2025-10-27
 */
public interface PriceListService {
    
    // ==================== 价目表管理 ====================
    
    /**
     * 创建价目表
     * 
     * @param request 创建价目表请求
     * @return 创建的价目表DTO
     */
    PriceListDTO createPriceList(CreatePriceListRequest request);
    
    /**
     * 更新价目表
     * 
     * @param id 价目表ID
     * @param request 更新价目表请求
     * @return 更新后的价目表DTO
     */
    PriceListDTO updatePriceList(String id, UpdatePriceListRequest request);
    
    /**
     * 根据ID获取价目表详情
     * 
     * @param id 价目表ID
     * @return 价目表DTO（包含所有条目）
     */
    PriceListDTO getPriceListById(String id);
    
    /**
     * 删除价目表（软删除）
     *
     * @param id 价目表ID
     */
    void deletePriceList(String id);
    
    
    /**
     * 获取所有价目表列表
     * 
     * @return 价目表摘要列表
     */
    List<PriceListSummaryDTO> getAllPriceLists();
    
    /**
     * 根据状态获取价目表
     * 
     * @param status 价目表状态
     * @return 价目表摘要列表
     */
    List<PriceListSummaryDTO> getPriceListsByStatus(PriceListStatus status);
    
    // ==================== 价目表激活/停用 ====================
    
    /**
     * 激活价目表
     * 
     * @param id 价目表ID
     * @return 更新后的价目表DTO
     */
    PriceListDTO activatePriceList(String id);
    
    /**
     * 停用价目表
     * 
     * @param id 价目表ID
     * @return 更新后的价目表DTO
     */
    PriceListDTO deactivatePriceList(String id);
    
    /**
     * 获取当前生效的价目表
     * 
     * @return 当前生效的价目表DTO，不存在返回null
     */
    PriceListDTO getCurrentEffectivePriceList();
    
    
    // ==================== 价目表条目管理 ====================
    
    /**
     * 添加价格条目
     * 
     * @param priceListId 价目表ID
     * @param request 添加价格条目请求
     * @return 添加的价格条目DTO
     */
    PriceListEntryDTO addPriceEntry(String priceListId, AddPriceEntryRequest request);
    
    /**
     * 更新价格条目
     * 
     * @param entryId 价格条目ID
     * @param unitPrice 新单价
     * @param saleUnit 新销售单位
     * @return 更新后的价格条目DTO
     */
    PriceListEntryDTO updatePriceEntry(String entryId, Money unitPrice, String saleUnit);
    
    /**
     * 删除价格条目
     * 
     * @param entryId 价格条目ID
     */
    void deletePriceEntry(String entryId);
    
    /**
     * 获取价目表的所有条目
     * 
     * @param priceListId 价目表ID
     * @return 价格条目列表
     */
    List<PriceListEntryDTO> getPriceEntriesByPriceList(String priceListId);
    
    /**
     * 根据商品获取价格条目
     * 
     * @param priceListId 价目表ID
     * @param productId 商品ID
     * @return 价格条目DTO，不存在返回null
     */
    PriceListEntryDTO getPriceEntryByProduct(String priceListId, String productId);
    
    // ==================== 价格查询 ====================
    
    /**
     * 获取商品当前价格（从当前生效的价目表中查询）
     * 
     * @param productId 商品ID
     * @return 价格条目DTO，不存在返回null
     */
    PriceListEntryDTO getCurrentPrice(String productId);
    
    /**
     * 获取商品当前单价
     * 
     * @param productId 商品ID
     * @return 单价，不存在返回null
     */
    Money getCurrentUnitPrice(String productId);
    
    /**
     * 批量获取商品当前价格
     * 
     * @param productIds 商品ID列表
     * @return 商品ID到价格条目的映射
     */
    java.util.Map<String, PriceListEntryDTO> getCurrentPrices(List<String> productIds);
    
    /**
     * 获取当前价目表下的商品列表（带价格和折扣信息）
     *
     * @return 商品列表DTO（ProductListItemDTO）
     */
    List<ProductListItemDTO> getCurrentPriceListProducts();

    /**
     * 检查商品是否有当前价格
     *
     * @param productId 商品ID
     * @return 是否有价格
     */
    boolean hasCurrentPrice(String productId);
    
    /**
     * 检查商品是否在当前激活的价目表中
     *
     * @param productId 商品ID
     * @return 是否在激活的价目表中
     */
    boolean isProductInActivePriceList(String productId);
    
    /**
     * 获取包含指定商品的激活价目表列表
     *
     * @param productId 商品ID
     * @return 价目表摘要列表
     */
    List<PriceListSummaryDTO> getActivePriceListsContainingProduct(String productId);
}

